package main

func main() {
	// Go语言nil：空值/零值
	// 在Go语言中，布尔类型的零值（初始值）为 false，数值类型的零值为 0，字符串类型的零值为空字符串 "" ，而指针、切片、映射、通道、函数和接口的零值则是 nil。

	// nil 标识符是不能比较的
	// fmt.Println(nil == nil)

	// nil 不是关键字或保留字
	// var nil = errors.New("my god")

	// nil 没有默认类型
	// fmt.Printf("%T", nil)
	// print(nil)

	// 不同类型 nil 的指针是一样的
	// var arr []int
	// var num *int
	// fmt.Printf("%p\n", arr)
	// fmt.Printf("%p", num)

	// 不同类型的 nil 是不能比较的
	// var m map[int]string
	// var ptr *int
	// fmt.Printf(m == ptr)

	// 两个相同类型的 nil 值也可能无法比较
	// var s1 []int
	// var s2 []int
	// fmt.Printf(s1 == s2)

	// nil 是 map、slice、pointer、channel、func、interface 的零值
	// var m map[int]string
	// var ptr *int
	// var c chan int
	// var sl []int
	// var f func()
	// var i interface{}
	// fmt.Printf("%#v\n", m)
	// fmt.Printf("%#v\n", ptr)
	// fmt.Printf("%#v\n", c)
	// fmt.Printf("%#v\n", sl)
	// fmt.Printf("%#v\n", f)
	// fmt.Printf("%#v\n", i)

	// 不同类型的 nil 值占用的内存大小可能是不一样的
	// 一个类型的所有的值的内存布局都是一样的，nil 也不例外，nil 的大小与同类型中的非 nil 类型的大小是一样的。但是不同类型的 nil 值的大小可能不同。
	// var p *struct{}
	// fmt.Println( unsafe.Sizeof( p ) ) // 8

	// var s []int
	// fmt.Println( unsafe.Sizeof( s ) ) // 24

	// var m map[int]bool
	// fmt.Println( unsafe.Sizeof( m ) ) // 8

	// var c chan string
	// fmt.Println( unsafe.Sizeof( c ) ) // 8

	// var f func()
	// fmt.Println( unsafe.Sizeof( f ) ) // 8

	// var i interface{}
	// fmt.Println( unsafe.Sizeof( i ) ) // 16
}
